package com.prototype.demo.deepclone;

/**
 * Created by Administrator on 2017/6/8.
 * 在深克隆中，无论原型对象的成员变量是值类型还是引用类型，都将复制一份给克隆对象，
 * 深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说，在深克隆中，除了对
 * 象本身被复制外，对象所包含的所有成员变量也将复制
 * 在Java语言中，如果需要实现深克隆，可以通过序列化(Serialization)等方式来实现。序列化就
 * 是将对象写到流的过程，写到流中的对象是原有对象的一个拷贝，而原对象仍然存在于内存
 * 中。通过序列化实现的拷贝不仅可以复制对象本身，而且可以复制其引用的成员对象，因此
 * 通过序列化将对象写到一个流中，再从流里将其读出来，可以实现深克隆。需要注意的是能
 * 够实现序列化的对象其类必须实现Serializable接口，否则无法实现序列化操作。下面我们使用
 * 深克隆技术来实现工作周报和附件对象的复制，由于要将附件对象和工作周报对象都写入流
 * 中，因此两个类均需要实现Serializable接口
 *
 * Java语言提供的Cloneable接口和Serializable接口的代码非常简单，它们都是空接口，这种
 * 空接口也称为标识接口，标识接口中没有任何方法的定义，其作用是告诉JRE这些接口的
 * 实现类是否具有某个功能，如是否支持克隆、是否支持序列化等。
 *
 */
public class Client {
    public static void main(String[] args) {

        WeekLog pre_log,log_new = null;
        pre_log = new WeekLog();
        Attachment attachment = new Attachment();
        pre_log.setAttachment(attachment);

        try{
            log_new = pre_log.deepClone();//调用深克隆
        }catch(Exception e){
            System.out.println("克隆失败");
        }
        System.out.println(log_new.getAttachment() == pre_log.getAttachment());
        System.out.println(log_new == pre_log);
    }
}
